﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;

namespace Administracja
{
    public partial class Salda : Form
    {
        private struct Stany
        {
            public double Stary;
            public double Wplaty;
            public double Wyplaty;
            public double Saldo;
        }

        private Stany _konto;
        private Stany _kasa;

        private PrintDocument pd;

        public Salda()
        {
            InitializeComponent();
            data_od.Value = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1);
            data_do.Value = new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.DaysInMonth(DateTime.Today.Year, DateTime.Today.Month));
            Wyswietl();
        }

        private void Wyswietl()
        {
            List<string> reader1D;

            _konto.Stary = 0;
            _konto.Wplaty = 0;
            _konto.Wyplaty = 0;
            _konto.Saldo = 0;

            _kasa.Stary = 0;
            _kasa.Wplaty = 0;
            _kasa.Wyplaty = 0;
            _kasa.Saldo = 0;

            if (poprzednie_saldo_ch.Checked)
            {
                stary_stan_konta.Enabled = true;
                stary_stan_kasy.Enabled = true;

                try
                {
                    reader1D = Baza.Wczytaj1D("SELECT KONTO, KASA FROM SALDA WHERE EXTRACT(MONTH FROM DATA) = '"
                        + data_od.Value.AddMonths(-1).Month + "'");
                    if (reader1D[0].Length != 0) _konto.Stary = Convert.ToDouble(reader1D[0]);
                    if (reader1D[1].Length != 0) _kasa.Stary = Convert.ToDouble(reader1D[1]);
                }
                catch
                {
                    reader1D = Baza.Wczytaj1D("SELECT KONTO, KASA, DATA FROM SALDA WHERE ID IN (SELECT MAX(ID) FROM SALDA WHERE DATA < '" + data_do.Value.ToString().Substring(0, 10) + "')");
                    if (reader1D.Count != 0 && reader1D[0].Length != 0) _konto.Stary = Convert.ToDouble(reader1D[0]);
                    if (reader1D.Count != 0 && reader1D[1].Length != 0) _kasa.Stary = Convert.ToDouble(reader1D[1]);

                    Wyjatki.Komunikat("Brak salda z poprzedniego miesiąca, używam salda z dnia " + OperacjeTekstowe.TrymujDate(reader1D[2]) + " .", "Brak poprzedniego salda", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else
            {
                stary_stan_kasy.Enabled = false;
                stary_stan_konta.Enabled = false;
            }

            try
            {
                //wplaty i odsetki na konto
                reader1D = Baza.Wczytaj1D("SELECT SUM(KWOTA), SUM(ODSETKI) FROM WPLATY WHERE SPOSOB = 'P' AND DATA >= '"
                    + data_od.Value.ToString("dd.MM.yyyy") + "' AND DATA <= '" + data_do.Value.ToString("dd.MM.yyyy") + "'");
                if (reader1D.Count > 0 && reader1D[0].Length > 0) _konto.Wplaty += Convert.ToDouble(reader1D[0]);
                if (reader1D.Count > 1 && reader1D[1].Length > 0) _konto.Wplaty += Convert.ToDouble(reader1D[1]);

                //wplaty i odsetki do kasy
                reader1D = Baza.Wczytaj1D("SELECT SUM(KWOTA), SUM(ODSETKI) FROM WPLATY WHERE SPOSOB = 'G' AND DATA >= '"
                    + data_od.Value.ToString("dd.MM.yyyy") + "' AND DATA <= '" + data_do.Value.ToString("dd.MM.yyyy") + "'");
                if (reader1D.Count > 0 && reader1D[0].Length > 0) _kasa.Wplaty += Convert.ToDouble(reader1D[0]);
                if (reader1D.Count > 1 && reader1D[1].Length > 0) _kasa.Wplaty += Convert.ToDouble(reader1D[1]);

                //inne obroty na konto
                reader1D = Baza.Wczytaj1D("SELECT SUM(KWOTA) FROM INNE_OBROTY WHERE DATA >= '"
                    + data_od.Value.ToString("dd.MM.yyyy") + "' AND DATA <= '" + data_do.Value.ToString("dd.MM.yyyy") + "' "
                    + "AND (TYP = 'kasa -> konto' OR TYP = 'inne -> konto')");
                if (reader1D.Count > 0 && reader1D[0].Length > 0) _konto.Wplaty += Convert.ToDouble(reader1D[0]);

                //inne obroty do kasy
                reader1D = Baza.Wczytaj1D("SELECT SUM(KWOTA) FROM INNE_OBROTY WHERE DATA >= '"
                    + data_od.Value.ToString("dd.MM.yyyy") + "' AND DATA <= '" + data_do.Value.ToString("dd.MM.yyyy") + "' "
                    + "AND (TYP = 'konto -> kasa' OR TYP = 'inne -> kasa')");
                if (reader1D.Count > 0 && reader1D[0].Length > 0) _kasa.Wplaty += Convert.ToDouble(reader1D[0]);

                //zakupy z konta
                reader1D = Baza.Wczytaj1D("SELECT SUM(SUMA_NETTO + SUMA_VAT) FROM ZAKUPY WHERE SPOSOB_ZAPLATY = 'P' AND Data_wplaty >= '"
                    + data_od.Value.ToString("dd.MM.yyyy") + "' AND Data_wplaty <= '" + data_do.Value.ToString("dd.MM.yyyy") + "'");
                if (reader1D.Count > 0 && reader1D[0].Length > 0) _konto.Wyplaty += Convert.ToDouble(reader1D[0]);

                //zakupy z kasy
                reader1D = Baza.Wczytaj1D("SELECT SUM(SUMA_NETTO + SUMA_VAT) FROM ZAKUPY WHERE SPOSOB_ZAPLATY = 'G' AND Data_wplaty >= '"
                    + data_od.Value.ToString("dd.MM.yyyy") + "' AND Data_wplaty <= '" + data_do.Value.ToString("dd.MM.yyyy") + "'");
                if (reader1D.Count > 0 && reader1D[0].Length > 0) _kasa.Wyplaty += Convert.ToDouble(reader1D[0]);

                //inne obroty z konta
                reader1D = Baza.Wczytaj1D("SELECT SUM(KWOTA) FROM INNE_OBROTY WHERE DATA >= '"
                    + data_od.Value.ToString("dd.MM.yyyy") + "' AND DATA <= '" + data_do.Value.ToString("dd.MM.yyyy") + "' "
                    + "AND (TYP = 'konto -> kasa' OR TYP = 'konto -> inne')");
                if (reader1D.Count > 0 && reader1D[0].Length > 0) _konto.Wyplaty += Convert.ToDouble(reader1D[0]);

                //inne obroty z kasy
                reader1D = Baza.Wczytaj1D("SELECT SUM(KWOTA) FROM INNE_OBROTY WHERE DATA >= '"
                    + data_od.Value.ToString("dd.MM.yyyy") + "' AND DATA <= '" + data_do.Value.ToString("dd.MM.yyyy") + "' "
                    + "AND (TYP = 'kasa -> konto' OR TYP = 'kasa -> inne')");
                if (reader1D.Count > 0 && reader1D[0].Length > 0) _kasa.Wyplaty += Convert.ToDouble(reader1D[0]);

                _konto.Saldo = _konto.Wplaty - _konto.Wyplaty;
                _kasa.Saldo = _kasa.Wplaty - _kasa.Wyplaty;

                if (poprzednie_saldo_ch.Checked)
                {
                    _konto.Saldo += _konto.Stary;
                    _kasa.Saldo += _kasa.Stary;
                }
            }
            catch (Exception ex)
            {
                Wyjatki.Error(ex);
            }

            stary_stan_konta.Text = "Poprzednie saldo: " + String.Format("{0:N2}", _konto.Stary);
            wplaty_konto.Text = "Wplaty: " + String.Format("{0:N2}", _konto.Wplaty);
            wyplaty_konto.Text = "Wyplaty: " + String.Format("{0:N2}", _konto.Wyplaty);
            saldo_konta.Text = "Saldo konta: " + String.Format("{0:N2}", _konto.Saldo);

            stary_stan_kasy.Text = "Poprzednie saldo: " + String.Format("{0:N2}", _kasa.Stary);
            wplaty_kasa.Text = "Wplaty: " + String.Format("{0:N2}", _kasa.Wplaty);
            wyplaty_kasa.Text = "Wyplaty: " + String.Format("{0:N2}", _kasa.Wyplaty);
            saldo_kasy.Text = "Saldo kasy: " + String.Format("{0:N2}", _kasa.Saldo);

            saldo_konto_kasa.Text = "Saldo konta i kasy: " + String.Format("{0:N2}", _konto.Saldo + _kasa.Saldo);
        }

        private void ZapiszClick(object sender, EventArgs e)
        {
            if (Wyjatki.Komunikat("Czy na pewno chcesz zapisać saldo?", "Zapisać?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                if (DateTime.Compare(DateTime.Parse(Baza.Wczytaj("SELECT MAX(DATA) FROM SALDA")), data_do.Value) > 0)
                {
                    Wyjatki.Komunikat("Istnieje nowsze saldo, niż to które chcesz zapisać. Aby edytować starsze saldo najpierw usuń nowsze.", "Istnieje nowsze saldo.", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
                {
                    Baza.Zapisz("DELETE FROM SALDA WHERE EXTRACT(MONTH FROM DATA) = '" + data_do.Value.Month + "' AND ID <> 0");
                    Baza.Ustaw("Salda");
                    Baza.Zapisz("INSERT INTO SALDA VALUES (GEN_ID(NUMERACJA_SALDA,1),'" + data_do.Value.ToString("dd.MM.yyyy") + "','"
                        + _konto.Saldo.ToString().Replace(",", ".") + "','" + _kasa.Saldo.ToString().Replace(",", ".") + "')");
                    Close();
                }
            }
        }

        private void AnulujClick(object sender, EventArgs e)
        {
            Close();
        }

        private void DrukujClick(object sender, EventArgs e)
        {
            pd = new PrintDocument();
            pd.PrintPage += PdPrintPage;
            print_dia.Document = pd;
            if (print_dia.ShowDialog() != DialogResult.OK) return;
            try
            {
                pd.Print();
            }
            catch (Exception ex)
            {
                Wyjatki.Error(ex);
            }
        }

        private void PodgladClick(object sender, EventArgs e)
        {
            pd = new PrintDocument();
            pd.PrintPage += PdPrintPage;
            podglad_dia.Document = pd;
            ((Form)podglad_dia).WindowState = FormWindowState.Maximized;
            podglad_dia.PrintPreviewControl.Zoom = 1.5;
            podglad_dia.ShowDialog();
        }

        private void PdPrintPage(object sender, PrintPageEventArgs e)
        {
            Graphics g = e.Graphics;

            int pozY = 50;
            const int lewyMargX = 50;
            const int xOpis = 100;
            const int xKonto = 450;
            const int xKasa = 700;

            g.DrawString("Saldo", Fonty.Naglowek, Brushes.Black, new PointF(375, pozY));
            g.DrawString("Za okres od  " + data_od.Value.ToString("dd.MM.yyyy") + " do  " + data_do.Value.ToString("dd.MM.yyyy"), Fonty.Okres, Brushes.Black, new PointF(lewyMargX, pozY + 30));

            var reader1D = Baza.Wczytaj1D("SELECT Nazwa_1, Nazwa_2, Adres_1, Adres_2 FROM DANE_SPRZEDAWCY");
            g.DrawString(reader1D[0] + " " + reader1D[1] + " " + reader1D[2] + " " + reader1D[3], Fonty.Normal, Brushes.Black, new PointF(lewyMargX, pozY + 50));

            pozY += 125;

            g.DrawString("Konto", Fonty.Okres, Brushes.Black, new PointF(xKonto - 75, pozY));
            g.DrawString("Kasa", Fonty.Okres, Brushes.Black, new PointF(xKasa - 75, pozY));

            pozY += 40;

            if (poprzednie_saldo_ch.Checked)
            {
                g.DrawString("Poprzednie saldo:", Fonty.Okres, Brushes.Black, new PointF(xOpis, pozY));
                g.DrawString(string.Format("{0:N2}", _kasa.Stary), Fonty.Okres, Brushes.Black, new PointF(xKasa, pozY), Fonty.Lewa);
                g.DrawString(string.Format("{0:N2}", _konto.Stary), Fonty.Okres, Brushes.Black, new PointF(xKonto, pozY), Fonty.Lewa);
            }
            pozY += 30;

            g.DrawString("Wplaty:", Fonty.Okres, Brushes.Black, new PointF(xOpis, pozY));
            g.DrawString(string.Format("{0:N2}", _kasa.Wplaty), Fonty.Okres, Brushes.Black, new PointF(xKasa, pozY), Fonty.Lewa);
            g.DrawString(string.Format("{0:N2}", _konto.Wplaty), Fonty.Okres, Brushes.Black, new PointF(xKonto, pozY), Fonty.Lewa);
            pozY += 30;

            g.DrawString("Wyplaty:", Fonty.Okres, Brushes.Black, new PointF(xOpis, pozY));
            g.DrawString(string.Format("{0:N2}", _kasa.Wyplaty), Fonty.Okres, Brushes.Black, new PointF(xKasa, pozY), Fonty.Lewa);
            g.DrawString(string.Format("{0:N2}", _konto.Wyplaty), Fonty.Okres, Brushes.Black, new PointF(xKonto, pozY), Fonty.Lewa);
            pozY += 30;

            g.DrawString("Saldo:", Fonty.Okres, Brushes.Black, new PointF(xOpis, pozY));
            g.DrawString(string.Format("{0:N2}", _kasa.Saldo), Fonty.Naglowek, Brushes.Black, new PointF(xKasa, pozY), Fonty.Lewa);
            g.DrawString(string.Format("{0:N2}", _konto.Saldo), Fonty.Naglowek, Brushes.Black, new PointF(xKonto, pozY), Fonty.Lewa);
            pozY += 30;

            g.DrawString("Saldo konta i kasy:", Fonty.Okres, Brushes.Black, new PointF(xOpis, pozY));
            g.DrawString(string.Format("{0:N2}", (_konto.Saldo + _kasa.Saldo)), Fonty.Naglowek, Brushes.Black, new PointF(600, pozY), Fonty.Lewa);
        }

        private void UsunClick(object sender, EventArgs e)
        {
            var reader1D = Baza.Wczytaj1D("SELECT MAX(ID) FROM SALDA");
            if (reader1D[0].Length > 0 && reader1D[0] != "0")
            {
                if (Wyjatki.Komunikat("Czy na pewno usunąć ostatnie saldo?", "Usunąć?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    Baza.Zapisz("DELETE FROM SALDA WHERE ID IN (SELECT MAX(ID) FROM SALDA)");
                    Baza.Ustaw("Salda");
                    Wyswietl();
                }
            }
            else
            {
                Wyjatki.Komunikat("Brak sald do usnięcia", "Brak sald", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void WyswietlHandler(object sender, EventArgs e)
        {
            Wyswietl();
        }
    }
}
